package com.shenglaotuan.community.common.service;

import com.shenglaotuan.community.common.exception.UploadEmptyException;
import com.shenglaotuan.community.common.exception.UploadIOException;
import com.shenglaotuan.community.common.exception.UploadSizeException;
import com.shenglaotuan.community.common.exception.UploadTypeException;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.statement.create.table.Index;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;

@Service
@Slf4j
public class UploadService {

    @Value("${upload.img.type}")
    private List<String> imgType;
    @Value("${upload.img.size}")
    private Long imgSize;
    @Value("${upload.movie.type}")
    private List<String> movieType;
    @Value("${upload.movie.size}")
    private Long movieSize;
    @Value("${static.filePath}")
    private String staticPath;

    /**
     * 上传图片
     * @param request
     * @param file 上传的文件
     * @param id 用户id
     * @param dir 保存文件夹路径
     * @return 文件保存的路径
     */
    public String uploadImg(HttpServletRequest request, MultipartFile file, String id, String dir){
        // 判断file是否为空
        if (file == null || file.isEmpty()) {
            throw new UploadEmptyException("上传文件不能为空！");
        }
        // 判断文件类型
        if(!imgType.contains(file.getContentType())){
            throw new UploadTypeException("图片类型只能是" + imgType);
        }
        // 判断文件大小
        if(file.getSize() > imgSize){
            throw new UploadSizeException("图片大小不能超过" + imgSize / 1024 / 1024 + "M");
        }
        // 获取文件夹路径
        String dirPath = request.getSession().getServletContext().getRealPath("/") + id + dir;
        File parent = new File(dirPath);
        // 判断parent目录是否不存在
        if (!parent.exists()) {
            // 是：创建目录
            parent.mkdirs();
        }
        // 获取文件后缀
        String uploadFile = file.getOriginalFilename();
        String ext = uploadFile.substring(uploadFile.lastIndexOf("."));
        // 生成文件名
        String fileName = "" + System.currentTimeMillis() + System.nanoTime() + ext;
        // 创建file对象
        File dest = new File(parent, fileName);
        try {
            // 保存文件
            file.transferTo(dest);
        } catch (IOException e) {
            throw new UploadIOException("保存图片时出现错误");
        }
        // 返回文件路径
        return "/" + id + dir + "/" + fileName;
    }

    /**
     * 上传文章的照片
     * @param request
     * @param file 上传的文件
     * @param id 用户id
     * @param dir 保存文件夹路径
     * @return 文章地址
     */
    public String uploadArticleImg(HttpServletRequest request, MultipartFile file, String id, String dir, String dirNum) {
        // 获取路径
        return uploadImg(request, file, id, dir + "/" + dirNum);
    }

    /**
     * 获取未使用的文章保存序号
     * @param request
     * @param id 用户id
     * @param dir 保存文件夹路径
     * @return
     */
    public int getArticleUploadDirNum(HttpServletRequest request, String id, String dir) {
        // 获取路径
        int index = 0;
        File parent = null;
        // 从 1 开始，一直查找到位置用过的文件夹名
        do {
            index++;
            String dirPath = request.getSession().getServletContext().getRealPath("/") + id + dir + "/" + index;
            parent = new File(dirPath);
        } while (parent.exists());

        return index;
    }
}
